home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / CDUNGEON / !CDUNGEON / c / NP2 < prev    next >
Text File  |  1991-05-20  |  6KB  |  316 lines

  1. /* GETOBJ--    FIND OBJ DESCRIBED BY ADJ, NAME PAIR */
  2.  
  3. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  4. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  5. /* WRITTEN BY R. M. SUPNIK */
  6.  
  7. #include "funcs.h"
  8. #include "vars.h"
  9. #include "parse.h"
  10.  
  11. static logical thisit_ P((integer, integer, integer, integer));
  12.  
  13. /* THIS ROUTINE DETAILS ON BIT 3 OF PRSFLG */
  14.  
  15. integer getobj_(oidx, aidx, spcobj)
  16. integer oidx;
  17. integer aidx;
  18. integer spcobj;
  19. {
  20.     /* System generated locals */
  21.     integer ret_val, i__1;
  22.  
  23.     /* Local variables */
  24.     integer i, av;
  25.     integer obj;
  26.     integer nobj;
  27.     logical chomp;
  28.  
  29. /* GETOBJ, PAGE 2 */
  30.  
  31.     chomp = FALSE_;
  32.     av = advs_1.avehic[play_1.winner - 1];
  33.     obj = 0;
  34. /*                         !ASSUME DARK. */
  35.     if (! lit_(play_1.here)) {
  36.     goto L200;
  37.     }
  38. /*                         !LIT? */
  39.  
  40.     obj = schlst_(oidx, aidx, play_1.here, 0, 0, spcobj);
  41. /*                         !SEARCH ROOM. */
  42.     if (obj < 0) {
  43.     goto L1000;
  44.     } else if (obj == 0) {
  45.     goto L200;
  46.     } else {
  47.     goto L100;
  48.     }
  49. /*                         !TEST RESULT. */
  50. L100:
  51.     if (av == 0 || av == obj || (objcts_1.oflag2[obj - 1] & FINDBT) 
  52.         != 0) {
  53.     goto L200;
  54.     }
  55.     if (objcts_1.ocan[obj - 1] == av) {
  56.     goto L200;
  57.     }
  58. /*                         !TEST IF REACHABLE. */
  59.     chomp = TRUE_;
  60. /*                         !PROBABLY NOT. */
  61.  
  62. L200:
  63.     if (av == 0) {
  64.     goto L400;
  65.     }
  66. /*                         !IN VEHICLE? */
  67.     nobj = schlst_(oidx, aidx, 0, av, 0, spcobj);
  68. /*                         !SEARCH VEHICLE. */
  69.     if (nobj < 0) {
  70.     goto L1100;
  71.     } else if (nobj == 0) {
  72.     goto L400;
  73.     } else {
  74.     goto L300;
  75.     }
  76. /*                         !TEST RESULT. */
  77. L300:
  78.     chomp = FALSE_;
  79. /*                         !REACHABLE. */
  80.     if (obj == nobj) {
  81.     goto L400;
  82.     }
  83. /*                         !SAME AS BEFORE? */
  84.     if (obj != 0) {
  85.     nobj = -nobj;
  86.     }
  87. /*                         !AMB RESULT? */
  88.     obj = nobj;
  89.  
  90. L400:
  91.     nobj = schlst_(oidx, aidx, 0, 0, play_1.winner, spcobj);
  92. /*                         !SEARCH ADVENTURER. */
  93.     if (nobj < 0) {
  94.     goto L1100;
  95.     } else if (nobj == 0) {
  96.     goto L600;
  97.     } else {
  98.     goto L500;
  99.     }
  100. /*                         !TEST RESULT */
  101. L500:
  102.     if (obj != 0) {
  103.     nobj = -nobj;
  104.     }
  105. /*                         !AMB RESULT? */
  106. L1100:
  107.     obj = nobj;
  108. /*                         !RETURN NEW OBJECT. */
  109. L600:
  110.     if (chomp) {
  111.     obj = -10000;
  112.     }
  113. /*                         !UNREACHABLE. */
  114. L1000:
  115.     ret_val = obj;
  116.  
  117.     if (ret_val != 0) {
  118.     goto L1500;
  119.     }
  120. /*                         !GOT SOMETHING? */
  121.     i__1 = objcts_1.olnt;
  122.     for (i = star_1.strbit + 1; i <= i__1; ++i) {
  123. /*                         !NO, SEARCH GLOBALS. */
  124.     if (! thisit_(oidx, aidx, i, spcobj)) {
  125.         goto L1200;
  126.     }
  127.     if (! ghere_(i, play_1.here)) {
  128.         goto L1200;
  129.     }
  130. /*                         !CAN IT BE HERE? */
  131.     if (ret_val != 0) {
  132.         ret_val = -i;
  133.     }
  134. /*                         !AMB MATCH? */
  135.     if (ret_val == 0) {
  136.         ret_val = i;
  137.     }
  138. L1200:
  139.     ;
  140.     }
  141.  
  142. L1500:
  143. /*                         !END OF SEARCH. */
  144.     return ret_val;
  145. } /* getobj_ */
  146.  
  147. /* SCHLST--    SEARCH FOR OBJECT */
  148.  
  149. /* DECLARATIONS */
  150.  
  151. integer schlst_(oidx, aidx, rm, cn, ad, spcobj)
  152. integer oidx;
  153. integer aidx;
  154. integer rm;
  155. integer cn;
  156. integer ad;
  157. integer spcobj;
  158. {
  159.     /* System generated locals */
  160.     integer ret_val, i__1, i__2;
  161.  
  162.     /* Local variables */
  163.     integer i, j, x;
  164.  
  165.     ret_val = 0;
  166. /*                         !NO RESULT. */
  167.     i__1 = objcts_1.olnt;
  168.     for (i = 1; i <= i__1; ++i) {
  169. /*                         !SEARCH OBJECTS. */
  170.     if ((objcts_1.oflag1[i - 1] & VISIBT) == 0 || (rm == 0 || ! 
  171.         qhere_(i, rm)) && (cn == 0 || objcts_1.ocan[i - 1] != cn) 
  172.         && (ad == 0 || objcts_1.oadv[i - 1] != ad)) {
  173.         goto L1000;
  174.     }
  175.     if (! thisit_(oidx, aidx, i, spcobj)) {
  176.         goto L200;
  177.     }
  178.     if (ret_val != 0) {
  179.         goto L2000;
  180.     }
  181. /*                         !GOT ONE ALREADY? */
  182.     ret_val = i;
  183. /*                         !NO. */
  184.  
  185. /* IF OPEN OR TRANSPARENT, SEARCH THE OBJECT ITSELF. */
  186.  
  187. L200:
  188.     if ((objcts_1.oflag1[i - 1] & TRANBT) == 0 && (
  189.         objcts_1.oflag2[i - 1] & OPENBT) == 0) {
  190.         goto L1000;
  191.     }
  192.  
  193. /* SEARCH IS CONDUCTED IN REVERSE.  ALL OBJECTS ARE CHECKED TO */
  194. /* SEE IF THEY ARE AT SOME LEVEL OF CONTAINMENT INSIDE OBJECT 'I'. */
  195. /* IF THEY ARE AT LEVEL 1, OR IF ALL LINKS IN THE CONTAINMENT */
  196. /* CHAIN ARE OPEN, VISIBLE, AND HAVE SEARCHME SET, THEY CAN QUALIFY */
  197.  
  198. /* AS A POTENTIAL MATCH. */
  199.  
  200.     i__2 = objcts_1.olnt;
  201.     for (j = 1; j <= i__2; ++j) {
  202. /*                         !SEARCH OBJECTS. */
  203.         if ((objcts_1.oflag1[j - 1] & VISIBT) == 0 || ! thisit_(
  204.             oidx, aidx, j, spcobj)) {
  205.         goto L500;
  206.         }
  207.         x = objcts_1.ocan[j - 1];
  208. /*                         !GET CONTAINER. */
  209. L300:
  210.         if (x == i) {
  211.         goto L400;
  212.         }
  213. /*                         !INSIDE TARGET? */
  214.         if (x == 0) {
  215.         goto L500;
  216.         }
  217. /*                         !INSIDE ANYTHING? */
  218.         if ((objcts_1.oflag1[x - 1] & VISIBT) == 0 || (
  219.             objcts_1.oflag1[x - 1] & TRANBT) == 0 && (
  220.             objcts_1.oflag2[x - 1] & OPENBT) == 0 || (
  221.             objcts_1.oflag2[x - 1] & SCHBT) == 0) {
  222.         goto L500;
  223.         }
  224.         x = objcts_1.ocan[x - 1];
  225. /*                         !GO ANOTHER LEVEL. */
  226.         goto L300;
  227.  
  228. L400:
  229.         if (ret_val != 0) {
  230.         goto L2000;
  231.         }
  232. /*                         !ALREADY GOT ONE? */
  233.         ret_val = j;
  234. /*                         !NO. */
  235. L500:
  236.         ;
  237.     }
  238.  
  239. L1000:
  240.     ;
  241.     }
  242.     return ret_val;
  243.  
  244. L2000:
  245.     ret_val = -ret_val;
  246. /*                         !AMB RETURN. */
  247.     return ret_val;
  248.  
  249. } /* schlst_ */
  250.  
  251. /* THISIT--    VALIDATE OBJECT VS DESCRIPTION */
  252.  
  253. /* DECLARATIONS */
  254.  
  255. static logical thisit_(oidx, aidx, obj, spcobj)
  256. integer oidx;
  257. integer aidx;
  258. integer obj;
  259. integer spcobj;
  260. {
  261.     /* Initialized data */
  262.  
  263. /*    THE FOLLOWING DATA STATEMENT USED RADIX-50 NOTATION (R50MIN/1RA/) */
  264.  
  265. /*       IN RADIX-50 NOTATION, AN "A" IN THE FIRST POSITION IS */
  266. /*       ENCODED AS 1*40*40 = 1600. */
  267.  
  268.     const integer r50min = 1600;
  269.  
  270.     /* System generated locals */
  271.     logical ret_val;
  272.  
  273.     /* Local variables */
  274.     integer i;
  275.  
  276.     ret_val = FALSE_;
  277. /*                         !ASSUME NO MATCH. */
  278.     if (spcobj != 0 && obj == spcobj) {
  279.     goto L500;
  280.     }
  281.  
  282. /* CHECK FOR OBJECT NAMES */
  283.  
  284.     i = oidx + 1;
  285. L100:
  286.     ++i;
  287.     if (ovoc[i - 1] <= 0 || ovoc[i - 1] >= r50min) {
  288.     return ret_val;
  289.     }
  290. /*                         !IF DONE, LOSE. */
  291.     if (ovoc[i - 1] != obj) {
  292.     goto L100;
  293.     }
  294. /*                         !IF FAIL, CONT. */
  295.  
  296.     if (aidx == 0) {
  297.     goto L500;
  298.     }
  299. /*                         !ANY ADJ? */
  300.     i = aidx + 1;
  301. L200:
  302.     ++i;
  303.     if (avoc[i - 1] <= 0 || avoc[i - 1] >= r50min) {
  304.     return ret_val;
  305.     }
  306. /*                         !IF DONE, LOSE. */
  307.     if (avoc[i - 1] != obj) {
  308.     goto L200;
  309.     }
  310. /*                         !IF FAIL, CONT. */
  311.  
  312. L500:
  313.     ret_val = TRUE_;
  314.     return ret_val;
  315. } /* thisit_ */
  316.